{
    SchemaConfigRoot: {
        SchemaType: SchemaTypeDict,
        SchemaRule: [
            HasKey(PUConst.UiBody)
        ]

    },
    PUConst.UiBody: {
        SchemaType: SchemaTypeDict,
        SchemaRule: [
            CheckAsType(PUConst.Ui)
        ]
    },
    PUConst.Ui: {
        SchemaType: SchemaTypeDict,
        SchemaRule: [
            HasKey(PUConst.UiPropType),
            KeyIn(PUConst.UiPropCollection),
            CheckAsTypeFromKey(PUConst.UiPropType)
        ]
    },
    "uid[a-zA-Z]+": {
        SchemaType: SchemaTypeDict,
        SchemaRule: [
            CheckAsType(PUConst.Ui)
        ]
    },

    #
    # Prop
    #
    PUConst.UiPropType: {
        SchemaType: SchemaTypeString,
        SchemaRule: [
            ValueIn(PUConst.UiTypeCollection)
        ]
    },
    PUConst.UiPropSubUI: {
        SchemaType: SchemaTypeArray | SchemaTypeDict,
        SchemaRule: [
            CheckForeachAsTypeRecursively(PUConst.Ui)
        ]
    },
    PUConst.UiPropText: {
        SchemaType: SchemaTypeString
    },
    PUConst.UiPropID: {
        SchemaType: SchemaTypeString
    },
    PUConst.UiPropColumn: {
        SchemaType: SchemaTypeInteger
    },
    PUConst.UiPropVisible: {
        SchemaType: SchemaTypeBool
    },
    PUConst.UiPropColor: {
        SchemaType: SchemaTypeString,
        SchemaRule: [
            ValueIn(PUConst.ColorCollection)
        ]
    },
    PUConst.UiPropApiTrigger: {
        SchemaType: SchemaTypeArray,
        SchemaRule: [
            CheckForeachAsType(PUConst.UiApiTrigger)
        ]
    },
    PUConst.UiPropURL: {
        SchemaType: SchemaTypeString,
        SchemaRule: [
            NotEmpty(SchemaTypeString)
        ]
    },
    PUConst.UiPropHasHeader: {
        SchemaType: SchemaTypeBool
    },
    PUConst.UiPropMapCredentical: {
        SchemaType: SchemaTypeString,
        SchemaRule: [
            NotEmpty(SchemaTypeString)
        ]
    },

    #
    # UI Type
    #
    PUConst.UiTypePanel: {
        SchemaInherit: PUConst.Ui
    },
    PUConst.UiTypeText: {
        SchemaInherit: PUConst.Ui,
        SchemaRule: [
            HasKey(PUConst.UiPropText),
        ]
    },
    PUConst.UiTypeSeparator: {
        SchemaInherit: PUConst.Ui
    },
    PUConst.UiTypeSpinPage: {
        SchemaInherit: PUConst.Ui,
        SchemaRule: [
            HasKey(PUConst.UiPropSubUI)
        ]
    },
    PUConst.UiTypeLayoutHorizontal: {
        SchemaInherit: PUConst.Ui
    },
    PUConst.UiTypeLayoutVertical: {
        SchemaInherit: PUConst.Ui
    },
    PUConst.UiTypeLayoutGrid: {
        SchemaInherit: PUConst.Ui,
        SchemaRule: [
            HasKey(PUConst.UiPropColumn)
        ]
    },
    PUConst.UiTypeInput: {
        SchemaInherit: PUConst.Ui
    },
    PUConst.UiTypePassword: {
        SchemaInherit: PUConst.Ui
    },
    PUConst.UiTypeButton: {
        SchemaInherit: PUConst.Ui
    },
    PUConst.UiTypeLink: {
        SchemaInherit: PUConst.Ui,
        SchemaRule: [
            HasKey(PUConst.UiPropText, PUConst.UiPropURL)
        ]
    },
    PUConst.UiTypeTab: {
        SchemaInherit: PUConst.Ui,
        SchemaRule: [
            HasKey(PUConst.UiPropSubUI)
        ]
    },
    PUConst.UiTypeTable: {
        SchemaInherit: PUConst.Ui,
        SchemaRule: [
            HasKey(PUConst.UiPropColumn)
        ]
    },
    PUConst.UiTypeDatetime: {
        SchemaInherit: PUConst.Ui
    },
    PUConst.UiTypeComboBox: {
        SchemaInherit: PUConst.Ui
    },
    PUConst.UiTypeComboList: {
        SchemaInherit: PUConst.Ui,
        SchemaRule: [
            HasKey(PUConst.UiPropText)
        ]
    },
    PUConst.UiTypeMap: {
        SchemaInherit: PUConst.Ui,
        SchemaRule: [
            HasKey(PUConst.UiPropMapCredentical)
        ]
    },

    #
    # API
    #
    PUConst.UiApiTrigger: {
        SchemaType: SchemaTypeDict,
        SchemaRule: [
            HasKey(PUConst.UiApi, PUConst.UiApiTriggerAction),
            KeyIn([PUConst.UiApi, PUConst.UiApiParams, PUConst.UiApiTriggerAction, PUConst.UiApiResults])
        ]
    },
    PUConst.UiApi: {
        SchemaType: SchemaTypeString,
        SchemaRule: [
            NotEmpty(SchemaTypeString)
        ]
    },
    PUConst.UiApiParams: {
        SchemaType: SchemaTypeArray,
        SchemaRule: [
            CheckForeachAsType(PUConst.UiApiData)
        ]
    },
    PUConst.UiApiData: {
        SchemaType: SchemaTypeDict,
        SchemaRule: [
            HasKey(PUConst.UiApiDataType, PUConst.UiApiDataValue),
            KeyIn([PUConst.UiApiDataType, PUConst.UiApiDataValue])
        ]
    },
    PUConst.UiApiDataType: {
        SchemaType: SchemaTypeString,
        SchemaRule: [
            ValueIn(PUConst.UiApiTypeCollection)
        ]
    },
    PUConst.UiApiDataValue: {
        SchemaType: SchemaTypeString,
        SchemaRule: [
            NotEmpty(SchemaTypeString)
        ]
    },
    PUConst.UiApiTriggerAction: {
        SchemaType: SchemaTypeString,
        SchemaRule: [
            ValueIn(PUConst.UiApiActionCollection)
        ]
    },
    PUConst.UiApiResults: {
        SchemaType: SchemaTypeDict,
        SchemaRule: [
            KeyIn([PUConst.UiApiResultSuccessful, PUConst.UiApiResultFailed, PUConst.UiApiResultInvalidToken, PUConst.UiApiResultException])
        ]
    },
    PUConst.UiApiResultSuccessful: {
        SchemaType: SchemaTypeArray,
        SchemaRule: [
            CheckForeachAsType(PUConst.UiApiResultCall)
        ]
    },
    PUConst.UiApiResultFailed: {
        SchemaInherit: PUConst.UiApiResultSuccessful
    },
    PUConst.UiApiResultInvalidToken: {
        SchemaInherit: PUConst.UiApiResultSuccessful
    },
    PUConst.UiApiResultException: {
        SchemaInherit: PUConst.UiApiResultSuccessful
    },
    PUConst.UiApiResultCall: {
        SchemaType: SchemaTypeString
    }
}
